package vues;

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Stroke;

import java.awt.geom.Point2D;
import java.awt.geom.Rectangle2D;

import sourceCode.Chariot;
import sourceCode.Guichet;

import vues.VueRail;

public class VueGuichet extends Vue {

    private Color couleurNormal = new Color(100, 100, 100);
    private Color couleurSurbrillance = new Color(200, 0, 0);
    private Color couleurSelectionne = new Color(0, 130, 250);
    private Color couleurPlein = new Color(250, 250, 20);

    private Guichet guichet;
    private VueAeroport vueAeroport;

    //Constantes
    private int longueurGuichet = 18;
    private int hauteurGuichet = 30;

    private Rectangle2D.Double rectangleGuichet;
    private Rectangle2D.Double rectangleTapis;


    public VueGuichet(VueAeroport v, Guichet c) {

        super();
        this.guichet = c;
        this.vueAeroport = v;
        Point centreGuichet = this.vueAeroport.convertCoordonnesToPixels(guichet.getCoordonnees());
        Point2D.Double point =
            new Point2D.Double(guichet.getCentreTapis().x, this.guichet.getCentreTapis().y - this.guichet.getHauteurTapis() /
                               2);
        Point centreTapis = this.vueAeroport.convertCoordonnesToPixels(point);

        this.rectangleTapis =
                new Rectangle2D.Double(centreTapis.x - VueRail.largeurRail / 2, centreTapis.y, vueAeroport.convertDistMetreToPixels(this.guichet.getLongueurTapis(),
                                                                                                                                    this.vueAeroport.getAeroport().getLongueur(),
                                                                                                                                    this.vueAeroport.getLongueurPixelCartePanel()),
                                       this.vueAeroport.convertDistMetreToPixels(this.guichet.getHauteurTapis(),
                                                                                 this.vueAeroport.getAeroport().getHauteur(),
                                                                                 this.vueAeroport.getHauteurPixelCartePanel()));
        this.rectangleGuichet =
                new Rectangle2D.Double(centreTapis.x - longueurGuichet, centreGuichet.getY() - (this.hauteurGuichet /
                                                                                                2),
                                       this.longueurGuichet, hauteurGuichet);
    }

    public boolean estPlein() {
        return this.guichet.estPlein();
    }

    public void afficherGuichetPlein() {

    }

    public void chargeImage(String image) {

    }

    @Override
    public boolean estCliquee(int x, int y) {
        return (this.rectangleGuichet.contains(x, y) || this.rectangleTapis.contains(x, y));
    }

    //Pour bien comprendre:
    //   _____      | /
    //  |__G__|-----x-
    //              | \
    //
    // |, /, \ représente des rails
    // ---- représente le tapis
    //
    // x représente le centre du guichet.

    @Override
    public void dessiner(Graphics g) {

        Color cTemp = g.getColor();
        if (!this.guichet.estPlein())
            g.setColor(this.couleurNormal);
        else
            g.setColor(this.couleurPlein);
        g.fillRect((int)this.rectangleGuichet.getX(), (int)this.rectangleGuichet.getY(),
                   (int)this.rectangleGuichet.getWidth(),
                   (int)this.rectangleGuichet.getHeight()); //dessin représentant le guichet
        g.fillRect((int)this.rectangleTapis.getX(), (int)this.rectangleTapis.getY(),
                   (int)this.rectangleTapis.getWidth(),
                   (int)this.rectangleTapis.getHeight()); //dessin du rectangle qui repr�sente le tapis

        if (estSelectionnee()) { //si l'utilisateur a clique sur le guichet pour le selectionner
            g.setColor(this.couleurSelectionne);
            Graphics2D g2d = (Graphics2D)g;
            float dash1[] = { 3.5f };
            Stroke roundStroke = new BasicStroke(1.5f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER, 10f, dash1, 0.0f);
            g2d.setStroke(roundStroke);
            g2d.drawRect((int)this.rectangleGuichet.getX(), (int)this.rectangleGuichet.getY(),
                         (int)(this.rectangleGuichet.getWidth() + this.rectangleTapis.getWidth()),
                         (int)(this.rectangleGuichet.getHeight())); //dessin représentant le guichet
        }
        if (vueAeroport.getChoixGuichet() &&
            !this.getGuichet().estPlein()) { //si on est en train de demander ? l'utilisateur de choisir un guichet et que le guichet n'est pas plein, on le met en surbrillance
            g.setColor(this.couleurSurbrillance);
            Graphics2D g2d = (Graphics2D)g;
            float dash1[] = { 3.5f };
            Stroke roundStroke = new BasicStroke(1.5f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER, 10f, dash1, 0.0f);
            g2d.setStroke(roundStroke);
            g2d.drawRect((int)this.rectangleGuichet.getX(), (int)this.rectangleGuichet.getY(),
                         (int)(this.rectangleGuichet.getWidth() + this.rectangleTapis.getWidth()),
                         (int)(this.rectangleGuichet.getHeight())); //dessin représentant le guichet
        }

        g.setColor(cTemp);
        return;
    }

    @Override
    public String getType() {
        return "VueGuichet";
    }

    public Guichet getGuichet() {
        return this.guichet;
    }
}
